/**
 * 创建时间： 2017年5月17日
 *
 * @Copyright 武汉雷软科技有限公司
 */
package com.lrkj.framework.util;

import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;
import org.yaml.snakeyaml.Yaml;

import lombok.extern.slf4j.Slf4j;

/**
 * <pre>
 * 创建人： 郭亮
 * 类描述：
 * 版本号：0.0.1
 * 修改人：
 * 修改时间：
 * 修改内容：
 * </pre>
 */
@Slf4j
public class YamlUtil {

    static {
        init();
    }

    /**
     * 默认配置文件
     */
    private final static String fileName = "config/application.yml";

    /**
     * 环境配置文件名
     */
    private final static String profileName = "config/application-{active}.yml";

    /**
     * 环境配置文件
     */
    private static String profile = YamlUtil.class.getResource("/").getPath() + fileName;

    /**
     * 配置属性
     */
    private static Properties properties;

    public static void init() {
        try {
            // 读取配置环境
            YamlPropertiesFactoryBean profileYaml = new YamlPropertiesFactoryBean();
            profileYaml.setResources(new ClassPathResource(fileName));
            properties = profileYaml.getObject();
            String active = properties.getProperty("spring.profiles.active[0]");
            if (!StringUtils.isEmpty(active)) {
                // 读取配置文件
                YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
                String resource = profileName.replace("{active}", active);
                profile = YamlUtil.class.getResource("/").getPath() + resource;
                yaml.setResources(new ClassPathResource(resource));
                Properties prop = yaml.getObject();
                // 把环境配置覆盖的公用配置文件
                properties.putAll(prop);
            }
        } catch (Exception e) {
            log.warn("读取配置文件异常", e);
        }
    }

    /**
     * 取属性文件值
     * 
     * @param key
     *            属性项
     * @return 属性值
     */
    public static String getProperty(String key) {
        try {
            return properties.getProperty(key);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 设置属性
     * 
     * @param key
     *            属性项
     * @param value
     *            属性值
     */
    @SuppressWarnings("unchecked")
    public static synchronized void setProperty(String key, String value) {
        Yaml yaml = new Yaml();
        try {
            LinkedHashMap<Object, Object> allMap = (LinkedHashMap<Object, Object>) yaml
                    .load(new FileInputStream(profile));
            String[] keys = key.split("\\.");
            Map<Object, Object> valueMap = parseMap(allMap, keys, 0);
            int last = keys.length - 1;
            if (valueMap != null && value.contains(keys[last])) {
                valueMap.put(keys[last], value);
                yaml.dump(allMap, new FileWriter(profile));
                init();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 解析map
     * 
     * @param map
     *            属性表
     * @param keys
     *            属性项集合
     * @param i
     *            表的索引
     * @return 属性
     */
    @SuppressWarnings("unchecked")
    private static Map<Object, Object> parseMap(Map<Object, Object> map, String[] keys, int i) {
        if (i == keys.length - 1) {
            return map;
        }
        return parseMap((LinkedHashMap<Object, Object>) map.get(keys[i]), keys, ++i);
    }
}
